
#ifndef _OFPRINT_COMMON_H_
#define _OFPRINT_COMMON_H_


#ifdef  __cplusplus
extern "C" {
#endif

#include<glib.h>
#include<libusb.h>
#include "app_fp256_360.h"

//#define OFP_FPRINT_LIST_FILE  "/mnt/hgfs/ofplist.conf"
#define OFP_FPRINT_LIST_FILE    "/usr/share/deepin-authentication/modes/ofprint2686-serverd/ofplist.conf"
#define OFP_DRIVER_CONFIG_FILE  "/usr/share/deepin-authentication/modes/ofprint2686-serverd/fp_driver.conf"
#define OFP_FPRINT_ENABLE       "enable"
#define OFP_FPRINT_USER_ID      "user_id"
#define OFP_FPRINT_NAME         "fprint_name"
#define OFP_FPRINT_ID           "fprint_id"

#define OFP_DEVICE_PARAM        "DeviceParam"
#define OFP_DEVICE_ENABLE       "enable"
#define OFP_MODE_FLAG           "ModeFlag"
#define OFP_REBOOT_FLAG         "RebootFlag"
#define PRINTF_LOG_FLAG         "PrintfLogFlag" //输出日志标志，0表示不输出，1表示输出

#define BASIC_PARAM             "BASIC_PARAM"
#define UPGRADE_MODE            "UpgradeMode"
#define AUTO_SUSPEND            "AutoSuspend"

// 定义升级模式
#define STR_FORCE_UPGRADE       "FORCE_UPGRADE"
#define STR_DONT_UPGRADE        "DONT_UPGRADE"
#define STR_AUTO_UPGRADE        "AUTO_UPGRADE"
#define STR_SMART_UPGRADE       "SMART_UPGRADE"

#define STR_UPGRADE_FLAG        "UpgradeFlag"


#define PRINT_LOG_MAX_SIZE  500


#define OFP_FPRINT_NUM_MAX  50  //最大录入指纹数量
#define OFP_GROUP_NAME_MAX  100 //指纹组名称最大长度
#define OFP_USER_ID_LEN_MAX 100 //用户id最大长度
#define OFP_FPRINT_NAME_LEN_MAX 100 //指纹名称最大长度

#define OFP_MSG_SIZE_MAX    1024    //消息最大长度


/* 定义输出消息的等级，与Linux内核中printk的等级定义一致 */
#define OFP_PRINT_LEVEL_EMERG   0
#define OFP_PRINT_LEVEL_ALERT   1
#define OFP_PRINT_LEVEL_CRIT    2
#define OFP_PRINT_LEVEL_ERROR   3   // 错误信息
#define OFP_PRINT_LEVEL_WARN    4   // 警告信息
#define OFP_PRINT_LEVEL_NOTICE  5   // 提示信息
#define OFP_PRINT_LEVEL_INFO    6   // 运行时信息
#define OFP_PRINT_LEVEL_DEBUG   7   // 调试信息


/* 定义输出控制等级及开关（环境变量） */
#define OFP_PRINT_LEVEL_DEFAULT OFP_PRINT_LEVEL_NOTICE  // 默认输出信息等级

/* 定义文件路径最大长度 */
#define MAX_PATH_LEN 1024

/* 定义默认的操作超时时间 */
#define OFP_OPS_DEFAULT_TIMEOUT 30

/* 版本信息 */
typedef struct api_version_t api_version;
struct api_version_t
{
    int major;
    int minor;
    int function;
};


/* USB设备热插拔行为 */
typedef enum {
    USB_HOT_PLUG_ATTACHED = 1,          /** USB设备接入 **/
    USB_HOT_PLUG_DETACHED = -1,         /** USB设备拔出 **/
}USBHotPlugActions;


/* USB设备硬件信息 */
struct usb_id {
    uint16_t idVendor;
    uint16_t idProduct;
    char * description;
};

/* USB设备额外的驱动信息 */
struct USB_INFO {
    const struct usb_id * id_table;
    libusb_hotplug_callback_handle callback_handle[2];
    unsigned long driver_data;
};


/* 定义操作类型 */
typedef enum {
    OPS_TYPE_COMM = 0,
    OPS_TYPE_OPEN,
    OPS_TYPE_ENROLL,
    OPS_TYPE_VERIFY,
    OPS_TYPE_IDENTIFY,
    OPS_TYPE_CAPTURE,
    OPS_TYPE_SEARCH,
    OPS_TYPE_CLEAN,
    OPS_TYPE_GET_FLIST,
    OPS_TYPE_RENAME,
    OPS_TYPE_CLOSE,
    OPS_TYPE_ENROLL_PROCESS,
}BioOpsType;

/*
 * 定义设备当前的状态
 * 一般来说，设备只会处于两种状态：设备正在处理中，设备空闲
 */
typedef enum {
    DEVS_COMM_IDLE = OPS_TYPE_COMM * 100,   /** 空闲状态 **/
    DEVS_COMM_DOING,                        /** 设备正在处理中 **/
    DEVS_COMM_STOP_BY_USER,                 /** 设备操作被终止 **/
    DEVS_COMM_DISABLE,                      /** 设备被禁用 **/
    DEVS_COMM_MAX,

    DEVS_OPEN_DOING = OPS_TYPE_OPEN * 100 + 1,  /** 正在打开设备 **/
    DEVS_OPEN_STOP_BY_USER,                     /** 打开操作被终止 **/
    DEVS_OPEN_MAX,

    DEVS_ENROLL_DOING = OPS_TYPE_ENROLL * 100 + 1,  /** 正在录入 **/
    DEVS_ENROLL_STOP_BY_USER,                       /** 打开操作被终止 **/
    DEVS_ENROLL_MAX,

    DEVS_VERIFY_DOING = OPS_TYPE_VERIFY * 100 + 1,  /** 正在认证 **/
    DEVS_VERIFY_STOP_BY_USER,                       /** 打开操作被终止 **/
    DEVS_VERIFY_MAX,

    DEVS_IDENTIFY_DOING = OPS_TYPE_IDENTIFY * 100 + 1,  /** 正在识别指定特征 **/
    DEVS_IDENTIFY_STOP_BY_USER,                         /** 打开操作被终止 **/
    DEVS_IDENTIFY_MAX,

    DEVS_CAPTURE_DOING = OPS_TYPE_CAPTURE * 100 + 1,    /** 正在捕获信息 **/
    DEVS_CAPTURE_STOP_BY_USER,                          /** 打开操作被终止 **/
    DEVS_CAPTURE_MAX,

    DEVS_SEARCH_DOING = OPS_TYPE_SEARCH * 100 + 1,  /** 正在搜索指定特征 **/
    DEVS_SEARCH_STOP_BY_USER,                       /** 打开操作被终止 **/
    DEVS_SEARCH_MAX,

    DEVS_CLEAN_DOING = OPS_TYPE_CLEAN * 100 + 1,    /** 正在清理特征数据 **/
    DEVS_CLEAN_STOP_BY_USER,                        /** 打开操作被终止 **/
    DEVS_CLEAN_MAX,

    DEVS_GET_FLIST_DOING = OPS_TYPE_GET_FLIST * 100 + 1,    /** 正在获取特征列表 **/
    DEVS_GET_FLIST_STOP_BY_USER,                            /** 获取特征列表操作被终止 **/
    DEVS_GET_FLIST_MAX,

    DEVS_RENAME_DOING = OPS_TYPE_RENAME * 100 + 1,  /** 正在重命名特征 **/
    DEVS_RENAME_STOP_BY_USER,                       /** 重命名特征操作被终止 **/
    DEVS_RENAME_MAX,

    DEVS_CLOSE_DOING = OPS_TYPE_CLOSE * 100 + 1,    /** 正在关闭设备 **/
    DEVS_CLOSE_STOP_BY_USER,                        /** 打开操作被终止 **/
    DEVS_CLOSE_MAX,
}DevStatus;

/*
 * 定义各种操作结果
 */
typedef enum {
    OPS_COMM_SUCCESS = OPS_TYPE_COMM * 100, /** 空闲状态 **/
    OPS_COMM_FAIL,                          /** 操作失败 **/
    OPS_COMM_NO_MATCH = OPS_COMM_FAIL,      /** 不匹配 **/
    OPS_COMM_ERROR,                         /** 通用操作错误 **/
    OPS_COMM_STOP_BY_USER,                  /** 用户取消 **/
    OPS_COMM_TIMEOUT,                       /** 操作超时 **/
    OPS_COMM_OUT_OF_MEM,                    /** 无法分配内存 **/
    OPS_COMM_MAX,

    OPS_OPEN_SUCCESS = OPS_TYPE_OPEN * 100, /** 打开设备完成 **/
    OPS_OPEN_FAIL,                          /** 打开设备失败 **/
    OPS_OPEN_ERROR,                         /** 打开设备遇到错误 **/
    OPS_OPEN_MAX,

    OPS_ENROLL_SUCCESS = OPS_TYPE_ENROLL * 100, /** 录入信息成功 **/
    OPS_ENROLL_FAIL,                            /** 录入失败 **/
    OPS_ENROLL_ERROR,                           /** 录入过程中遇到错误 **/
    OPS_ENROLL_STOP_BY_USER,                    /** 录入被用户中断 **/
    OPS_ENROLL_TIMEOUT,                         /** 操作超时 **/
    OPS_ENROLL_MAX,

    OPS_VERIFY_MATCH = OPS_TYPE_VERIFY * 100,   /** 认证匹配 **/
    OPS_VERIFY_NO_MATCH,                        /** 认证不匹配 **/
    OPS_VERIFY_ERROR,                           /** 认证过程中遇到错误 **/
    OPS_VERIFY_STOP_BY_USER,                    /** 认证被用户中断 **/
    OPS_VERIFY_TIMEOUT,                         /** 操作超时 **/
    OPS_VERIFY_MAX,

    OPS_IDENTIFY_MATCH = OPS_TYPE_IDENTIFY * 100,   /** 识别到指定特征 **/
    OPS_IDENTIFY_NO_MATCH,                          /** 未识别出指定特征 **/
    OPS_IDENTIFY_ERROR,                             /** 识别过程中遇到错误 **/
    OPS_IDENTIFY_STOP_BY_USER,                      /** 识别被用户中断 **/
    OPS_IDENTIFY_TIMEOUT,                           /** 操作超时 **/
    OPS_IDENTIFY_MAX,

    OPS_CAPTURE_SUCCESS = OPS_TYPE_CAPTURE * 100,   /** 捕获成功 **/
    OPS_CAPTURE_FAIL,                               /** 捕获失败 **/
    OPS_CAPTURE_ERROR,                              /** 捕获过程中遇到错误 **/
    OPS_CAPTURE_STOP_BY_USER,                       /** 捕获被用户中断 **/
    OPS_CAPTURE_TIMEOUT,                            /** 操作超时 **/
    OPS_CAPTURE_MAX,

    OPS_SEARCH_MATCH = OPS_TYPE_SEARCH * 100,   /** 搜索到指定特征 **/
    OPS_SEARCH_NO_MATCH,                        /** 未搜索到指定特征 **/
    OPS_SEARCH_ERROR,                           /** 搜索过程中遇到错误 **/
    OPS_SEARCH_STOP_BY_USER,                    /** 搜索被用户中断 **/
    OPS_SEARCH_TIMEOUT,                         /** 操作超时 **/
    OPS_SEARCH_MAX,

    OPS_CLEAN_SUCCESS = OPS_TYPE_CLEAN * 100,   /** 清理特征成功 **/
    OPS_CLEAN_FAIL,                             /** 清理失败 **/
    OPS_CLEAN_ERROR,                            /** 清理过程中遇到错误 **/
    OPS_CLEAN_STOP_BY_USER,                     /** 清理被用户中断 **/
    OPS_CLEAN_TIMEOUT,                          /** 操作超时 **/
    OPS_CLEAN_MAX,

    OPS_GET_FLIST_SUCCESS = OPS_TYPE_GET_FLIST * 100,   /** 获取特征列表完成 **/
    OPS_GET_FLIST_FAIL,                                 /** 获取特征列表失败 **/
    OPS_GET_FLIST_ERROR,                                /** 获取特征列表过程中遇到错误 **/
    OPS_GET_FLIST_STOP_BY_USER,                         /** 获取特征列表被用户中断 **/
    OPS_GET_FLIST_TIMEOUT,                              /** 获取特征列表超时 **/
    OPS_GET_FLIST_MAX,

    OPS_RENAME_SUCCESS = OPS_TYPE_RENAME * 100, /** 重命名特征完成 **/
    OPS_RENAME_FAIL,                            /** 重命名特征失败 **/
    OPS_RENAME_ERROR,                           /** 重命名特征过程中遇到错误 **/
    OPS_RENAME_STOP_BY_USER,                    /** 重命名特征被用户中断 **/
    OPS_RENAME_TIMEOUT,                         /** 重命名特征超时 **/
    OPS_RENAME_MAX,

    OPS_CLOSE_SUCCESS = OPS_TYPE_CLOSE * 100,   /** 关闭设备完成 **/
    OPS_CLOSE_FAIL,                             /** 关闭设备失败 **/
    OPS_CLOSE_ERROR,                            /** 关闭设备过程中遇到错误 **/
    OPS_CLOSE_MAX,
}OpsResult;

/*
 * 定义各种面向用户的提示消息
 */
typedef enum {
    NOTIFY_COMM_IDLE = OPS_TYPE_COMM * 100,     /** 空闲状态 **/
    NOTIFY_COMM_SUCCESS = NOTIFY_COMM_IDLE,     /** 操作成功 **/
    NOTIFY_COMM_FAIL,                           /** 操作失败 **/
    NOTIFY_COMM_NO_MATCH = NOTIFY_COMM_FAIL,    /** 不匹配 **/
    NOTIFY_COMM_ERROR,                          /** 操作过程中遇到错误 **/
    NOTIFY_COMM_STOP_BY_USER,                   /** 用户中断 **/
    NOTIFY_COMM_TIMEOUT,                        /** 操作超时 **/
    NOTIFY_COMM_DISABLE,                        /** 设备不可用 **/
    NOTIFY_COMM_OUT_OF_MEM,
    NOTIFY_COMM_UNSUPPORTED_OPS,                /** 不支持的操作 **/
    NOTIFY_COMM_MAX,

    NOTIFY_OPEN_SUCCESS = OPS_TYPE_OPEN * 100,  /** 打开设备完成 **/
    NOTIFY_OPEN_FAIL,                           /** 打开设备失败 **/
    NOTIFY_OPEN_ERROR,                          /** 打开设备过程中遇到错误 **/
    NOTIFY_OPEN_MAX,

    NOTIFY_ENROLL_SUCCESS = OPS_TYPE_ENROLL * 100,  /** 录入信息成功 **/
    NOTIFY_ENROLL_FAIL,                             /** 录入失败 **/
    NOTIFY_ENROLL_ERROR,                            /** 录入过程中遇到错误 **/
    NOTIFY_ENROLL_STOP_BY_USER,                     /** 录入被用户中断 **/
    NOTIFY_ENROLL_TIMEOUT,                          /** 操作超时 **/
    NOTIFY_ENROLL_MAX,

    NOTIFY_VERIFY_MATCH = OPS_TYPE_VERIFY * 100,    /** 认证匹配 **/
    NOTIFY_VERIFY_NO_MATCH,                         /** 认证不匹配 **/
    NOTIFY_VERIFY_ERROR,                            /** 认真过程中遇到错误 **/
    NOTIFY_VERIFY_STOP_BY_USER,                     /** 认证被用户中断 **/
    NOTIFY_VERIFY_TIMEOUT,                          /** 操作超时 **/
    NOTIFY_VERIFY_MAX,

    NOTIFY_IDENTIFY_MATCH = OPS_TYPE_IDENTIFY * 100,    /** 识别到指定特征 **/
    NOTIFY_IDENTIFY_NO_MATCH,                           /** 未识别出指定特征 **/
    NOTIFY_IDENTIFY_ERROR,                              /** 识别过程中遇到错误 **/
    NOTIFY_IDENTIFY_STOP_BY_USER,                       /** 识别被用户中断 **/
    NOTIFY_IDENTIFY_TIMEOUT,                            /** 操作超时 **/
    NOTIFY_IDENTIFY_MAX,

    NOTIFY_CAPTURE_SUCCESS = OPS_TYPE_CAPTURE * 100,    /** 捕获成功 **/
    NOTIFY_CAPTURE_FAIL,                                /** 捕获失败 **/
    NOTIFY_CAPTURE_ERROR,                               /** 捕获过程中遇到错误 **/
    NOTIFY_CAPTURE_STOP_BY_USER,                        /** 捕获被用户中断 **/
    NOTIFY_CAPTURE_TIMEOUT,                             /** 操作超时 **/
    NOTIFY_CAPTURE_MAX,

    NOTIFY_SEARCH_MATCH = OPS_TYPE_SEARCH * 100,    /** 搜索到指定特征 **/
    NOTIFY_SEARCH_NO_MATCH,                         /** 未搜索到指定特征 **/
    NOTIFY_SEARCH_ERROR,                            /** 搜索过程中遇到错误 **/
    NOTIFY_SEARCH_STOP_BY_USER,                     /** 搜索被用户中断 **/
    NOTIFY_SEARCH_TIMEOUT,                          /** 操作超时 **/
    NOTIFY_SEARCH_MAX,

    NOTIFY_CLEAN_SUCCESS = OPS_TYPE_CLEAN * 100,    /** 清理特征成功 **/
    NOTIFY_CLEAN_FAIL,                              /** 清理失败 **/
    NOTIFY_CLEAN_ERROR,                             /** 清理过程中遇到错误 **/
    NOTIFY_CLEAN_STOP_BY_USER,                      /** 清理被用户中断 **/
    NOTIFY_CLEAN_TIMEOUT,                           /** 操作超时 **/
    NOTIFY_CLEAN_MAX,

    NOTIFY_GET_FLIST_SUCCESS = OPS_TYPE_GET_FLIST * 100,    /** 获取特征列表完成 **/
    NOTIFY_GET_FLIST_FAIL,                                  /** 获取特征列表失败 **/
    NOTIFY_GET_FLIST_ERROR,                                 /** 获取特征列表过程中遇到错误 **/
    NOTIFY_GET_FLIST_STOP_BY_USER,                          /** 获取特征列表被用户中断 **/
    NOTIFY_GET_FLIST_TIMEOUT,                               /** 获取特征列表超时 **/
    NOTIFY_GET_FLIST_MAX,

    NOTIFY_RENAME_SUCCESS = OPS_TYPE_RENAME * 100,      /** 重命名特征完成 **/
    NOTIFY_RENAME_FAIL,                                 /** 重命名特征失败 **/
    NOTIFY_RENAME_ERROR,                                /** 重命名特征过程中遇到错误 **/
    NOTIFY_RENAME_INCOMPLETE,                           /** 重命名特征不完全 **/

    NOTIFY_CLOSE_SUCCESS = OPS_TYPE_CLOSE * 100,        /** 关闭设备完成 **/
    NOTIFY_CLOSE_FAIL,                                  /** 关闭设备失败 **/
    NOTIFY_CLOSE_ERROR,                                 /** 关闭设备过程中遇到错误 **/
    NOTIFY_CLOSE_MAX,
}NotifyMID;


/* 定义状态类型，用于通知服务层设备状态的改变 */
typedef enum {
    STATUS_TYPE_DEVICE = 0,
    STATUS_TYPE_OPERATION,
    STATUS_TYPE_NOTIFY
}StatusType;

/*
 * 生物特征识别框架核心结构体，用于记录驱动与设备相关信息
 * 正常情况下，一台机器上同一型号设备只会接入一台，所以框架将驱动与设备简化成一个结构体
 */
typedef struct ofp_dev_t ofp_dev;
struct ofp_dev_t {
    // 设备、驱动基本信息
    int driver_id;          /** 驱动ID **/
    char *device_name;      /** 设备名 **/
    char *full_name;        /** 设备全称 **/
    api_version drv_api_version;
    int enable;             /** 设备是否被禁用 **/
    int dev_num;            /** 设备数量 **/

    // 总线信息
    struct USB_INFO     usb_info;

    // 设备、驱动私有信息
    void *dev_priv;         /** 设备驱动私有结构体 **/

    libusb_context *ctx;
    pthread_mutex_t usb_mutex; /* libusb 库存在大量线程不安全函数，需要加锁 */
    pthread_mutex_t hotplug_mutex; /*  热插拔事件中操作全局变量，是线程非常不安全的，需要加锁 */
    pthread_mutex_t usb_bulk_mutex; /* usb bulk传输加锁 ，由于代码整体还不熟悉，后续可能删除，共用usb_mutex*/



    // 边界值
    int max_user;
    int max_sample;
    int sample_times;

    /*
     * 记录设备的状态信息：
     *
     * DevStatus dev_status 用于记录设备当前状态：“使用中”或者“空闲”
     * OpsResult ops_result 用于记录对设备操作的结果
     *                      注意：各个设备操作函数的返回值只是操作结果的辅助信息，最终的
     *                           结果判断是依据ops_result的值来确定的。
     * NotifyMID notify_mid 用于人机交互，记录需要展示给用户看的消息的ID
     */
    volatile DevStatus dev_status;  /** 设备状态 **/
    volatile OpsResult ops_result;  /** 操作结果 **/
    volatile NotifyMID notify_mid;  /** 给用户的消息ID **/

    // 指向驱动的句柄，由框架使用，驱动请勿修改该值
    void * plugin_handle;

    void (*ops_free)(ofp_dev *dev);

    /*
     * 设备发现
     *   检测系统环境中接入驱动支持的设备数量
     *
     * @param[in]   dev     驱动和设备的结构体
     * @return      探测到的设备数量。如果过程中遇到错误，则返回负值
     */
    int (*ops_discover)(ofp_dev *dev);
};

// 扩展提示信息的长度
#define EXTRA_INFO_LENGTH 1024

// 状态控制标志定义
#define CONTROL_FLAG_IDLE 0
#define CONTROL_FLAG_RUNNING 1
#define CONTROL_FLAG_STOPING 2
#define CONTROL_FLAG_STOPPED 3
#define CONTROL_FLAG_DONE 4


// 定义操作提示
enum demo_notify_mid {
    MID_EXTENDED_MESSAGE = NOTIFY_COMM_MAX + 1, // 定义扩展信息
};

// 定义升级模式
typedef enum _UPGRADE_MODE_TYPE_
{
    FORCE_UPGRADE = 1,//不判断版本，强制升级
    DONT_UPGRADE = 2,//不执行升级
    AUTO_UPGRADE = 3,//判断版本不同则升级
    SMART_UPGRADE = 4,//判断新版本高于实际版本则升级
}UPGRADE_MODE_TYPE;


// 指纹信息结构体
typedef struct fprint_info_t fprint_info;
struct fprint_info_t {
    // 是否录入指纹
    gboolean enable;
    // 用户id
    char user_id[OFP_USER_ID_LEN_MAX];
    // 指纹名称
    char fprint_name[OFP_FPRINT_NAME_LEN_MAX];
    // 指纹ID
    uint16 fprint_id;
};


// 指纹信息结构体
typedef struct _DRIVER_CONFIG_STRUCT_
{
    UPGRADE_MODE_TYPE upgrade_mode; //升级模式
    uint8   autosuspend_flag;   //自动挂起标志，0: 不自动挂起，1: 开启自动挂起
    int upgrade_flag;
}DRIVER_CONFIG_STRUCT;



// 驱动私有结构体
// 设备驱动私有结构体， 指向设备驱动还需要的额外结构体
typedef struct driver_info_t driver_info;
struct driver_info_t {
    // 超时时间， 单位毫秒
    int timeoutMS;
    // 控制标志
    int ctrlFlag;
    // 扩展提示信息（ 后续将用到）
    char extra_info[EXTRA_INFO_LENGTH];


    uint8 dev_state;//指纹设备状态
    int mode_flag;//设备模式
    int reboot_flag;//reboot标志
    fprint_info fprint_list[OFP_FPRINT_NUM_MAX];// 指纹列表信息
    //当前用户id
    char user_id[OFP_USER_ID_LEN_MAX];

    DRIVER_CONFIG_STRUCT config;
    FP_DEVICE_PARAM_STRUCT fp_device_param;

    int (*set_dev_state)(uint8 state);
};

//extern ofp_dev * ofp_dev_new();
extern ofp_dev *dev_ofprint;

extern int ofp_dev_init(void);
extern int ofp_drv_init(ofp_dev *dev);

extern void ofp_dev_free(ofp_dev * dev);
extern void ofp_ops_free(ofp_dev *dev);
extern int ofp_conf_init();
//extern void ofp_conf_free();
extern int ofp_get_fprint_list(ofp_dev *dev);
extern int ofp_add_fprint_info(ofp_dev *dev, fprint_info *fprint_info);
extern int ofp_del_fprint_info(ofp_dev *dev, char *user_id, char *fprint_name);
extern int ofp_find_fprint_info_byfprintid(ofp_dev *dev, uint16 fprintid, fprint_info **fprint_found);
extern int ofp_find_fprint_info(ofp_dev *dev, char *user_id, char *fprint_name, fprint_info **fprint_found);
extern int ofp_set_fprint_info(ofp_dev *dev, int index, fprint_info *xfprint_info);
extern void ofp_set_dev_status(ofp_dev * dev, int status);
extern int ofp_get_dev_status(ofp_dev * dev);
extern void ofp_status_changed_common_callback(int drvid, int type);
extern int32 driver_config_init(DRIVER_CONFIG_STRUCT *config);
extern int change_fw_upgrade_flag(void);


#ifdef  __cplusplus
}
#endif

#endif // BIOMETRIC_COMM_H

